/**
 * v-hasPermi 操作权限处理
 *  el：指令绑定到的元素。这可以用于直接操作 DOM。

    binding：一个对象，包含以下属性。
        value：传递给指令的值。例如在 v-my-directive="1 + 1" 中，值是 2。
        oldValue：之前的值，仅在 beforeUpdate 和 updated 中可用。无论值是否更改，它都可用。
        arg：传递给指令的参数 (如果有的话)。例如在 v-my-directive:foo 中，参数是 "foo"。
        modifiers：一个包含修饰符的对象 (如果有的话)。例如在 v-my-directive.foo.bar 中，修饰符对象是 { foo: true, bar: true }。
        instance：使用该指令的组件实例。
        dir：指令的定义对象。
        
    vnode：代表绑定元素的底层 VNode。

    prevVnode：代表之前的渲染中指令所绑定元素的 VNode。仅在 beforeUpdate 和 updated 钩子中可用。
 */

import { useUserStore } from '@/store/modules/user';
interface DirectiveBinding {
    arg?: string;
    value?: any;
}

export default {
    // 在元素被插入到 DOM 前调用
    mounted(el: HTMLElement, binding: DirectiveBinding, _vnode: any) {
        const { value } = binding;
        const useUser = useUserStore();
        const all_permission = useUser.roles.some((item) => item.role === 'admin');
        const permissions = useUser.permissions;

        // 管理员
        if (all_permission) {
            return;
        }
        // 非管理员检测菜单权限
        if (value && value instanceof Array && value.length > 0) {
            const permissionFlag = value;

            const hasPermissions = permissions.some((permission) => {
                return permissionFlag.includes(permission);
            });

            if (!hasPermissions) {
                el.parentNode && el.parentNode.removeChild(el);
            }
        } else {
            throw new Error(`请设置操作权限标签值`);
        }
    },
};
